import 'reflect-metadata' // 获取元数据功能

// function required(target: any, propertyKey: string) {
//   Reflect.defineMetadata('required', true, target, propertyKey)
// }
// // 验证函数
// function validate (user: User) {
//   for (const key in user) {
//     // 如果该属性有 required 元数据并且该属性的值为空 则报错
//     if(Reflect.getMetadata('required', user, key) && !user[key])  {
//       console.log('required 失败 ')
//     }
//   }
// }
// class User {
//   @required
//   username: string
// }
// const user = new User()
// user.username = ''
// validate(user)


// 通过装饰器给类中的属性默认值 ( tsconfig.json 中 target: ES2021 才会生效 )
// 因为 ES2021 中会将类里面没有赋值的属性给删除掉从而使用原型上同名的属性
function defaultValue(value: any) {
  return function (target: any, propertyKey: string | symbol) {
    let val = value
    const getter = function () {
      return val
    }
    const setter = function (newVal) {
      val = newVal
    }
    // 重写数据属性描述符为访问器描述符
    Object.defineProperty(target, propertyKey, {
      enumerable: true, // 可枚举
      configurable: true, // 可配置
      get: getter,
      set: setter,
    })
  }
}
class Settings {
  @defaultValue('dark')
  theme: string
  @defaultValue(30)
  timeout: number
}
const settings = new Settings()
console.log(settings.theme)
console.log(settings.timeout)

